home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / HARDWARE / IICALARM / !iicAlarm / AlarmSet (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1994-05-04  |  11KB  |  373 lines

  1.  >AlarmDk030
  2.  AlarmSet 0.30
  3.  Dekodiere !Alarm-File von RISC OS 3.11
  4.  Version 0.30
  5.   Lade Alarmfile, teste Header
  6.   Suche naechsten Task-Alarm
  7.   Stelle Zeit fest
  8.   umrechnen der Zeit nach Territory, PRM3 3-785ff
  9.   kodiere Zeit fuer IIC-Uhr und setzte Zeit.
  10.   Setze Alarm-Modus in der Uhr und schalte Alarm-Leitung aus.
  11. +8192
  12.  globale Variablen
  13. >clkadr% = %10100000      :
  14.  IIC-Adresse der Archimedes-Uhr
  15. =file$   = "<Alarmfile>"  :
  16.  Name und Pfad der Alarm-Datei
  17.  buf% 32
  18.  "Error in ";
  19. "*CLOSE":
  20. 8debug% = 
  21.            :
  22.  Informationstexte anzeigen ?
  23. "XOS_ReadVarVal", "AlarmExt$Debug", buf%, -1, 0, 0 
  24.  ,,d%
  25.  d%<>0 
  26.  debug% = 
  27. "XWimp_ReadSysInfo", 3 
  28.  d%=0 
  29.  debug% = 
  30.  debug% 
  31.  "AlarmSet version 0.30, ABt.   "
  32.  This is to help the shutdown-routine.
  33.  We need to know the status of the computer because we have to decide
  34.  between desktop-shutdown and non-desktop...
  35.  If we are in command-mode/non-desktop. We can simply call the
  36.  switch-off function.
  37.  We check it by the number of existing applications.
  38.  0 = No Desktop at all. 1 = only we are running. >1 = more apps exist.
  39. "Wimp_ReadSysInfo", 0 
  40.  tasknum%
  41.  tasknum%<2 
  42.   *Set Alarm$Desktop NO
  43.   *Set Alarm$Desktop YES
  44. -#a% = 
  45. setzeTaskalarmzeit(file$)
  46. /*   
  47.  1 : 
  48.  "Error: Missing Alarmfile."
  49. 0=   
  50.  2 : 
  51.  "Error in Alarmfile: wrong file/format or so."
  52. 5O---------------------------------------------------------------------------
  53. _setze_Task-Alarm-Zeit
  54. 7I; die Routine liest die Alarm-Datei und sucht den naechste Task-Alarm
  55. 8C; heraus. Die Zeit wird gelesen und in die IIC-Uhr geschrieben.
  56. 9>; Es werden eigene fehlerstabile Dateilesebefehle benutzt.
  57. :A; Am Ende gibt die Routine zentral eine Fehlermeldung heraus.
  58. ;G; Es wird auch nicht die ganze Datei gelesen, sondern lediglich die
  59. <D; interessanten Stellen angefahren und jeweils ein Byte gelesen.
  60. ; moegliche Fehlercodes...
  61. ; 1 - Alarmdatei fehlt.
  62. ??; 2 - falsche Alarmdatei, zu kurz, falscher Header oder so.
  63. A-; Ein: String mit Pfad und Name der Datei
  64. B%; Aus: Fehlercode ( = 0 wenn ok.)
  65. setzeTaskalarmzeit(name$)
  66.  err%, err$, hdl%, rec%, flag%, buf%, str%, ord%
  67.  l%, n%, n$
  68.    buf% 16, str% 64, ord% 40
  69. IF   
  70.  Wir haben ein lokales Error-System um Dateifehler abzufangen.
  71. JK   
  72.  Dies wird nur noch benoetigt, um ungewoehnliche Fehler abzufangen.
  73. L=   
  74.  "FNsetzeTaskalarmzeit: Error in ";
  75.    err% = 0
  76.    err$ = ""
  77. P;   
  78.  Oeffne Datei und teste damit ob sie vorhanden ist.
  79. Q6   
  80.  Der Handle ist 0, wenn Datei nicht vorhanden.
  81. R&   
  82.  debug% 
  83.  "File:";name$;" ";
  84.    hdl% = 
  85. openin(name$)
  86. T(   
  87.  debug% 
  88.  " Filehandle: ";hdl%
  89. U=   
  90.  hdl% = 0 
  91.  err% = 1: err$ = "Alarmdatei nicht da !!"
  92.  Lade Header
  93.  err% = 0 
  94.       n$ = ""
  95.       
  96.  l%=1
  97.          n% = 
  98. bget(hdl%)
  99.          
  100.  n%<0 
  101.             err% = 2
  102. ^/            err$ = "Alarmheader zu kurz !!"
  103.             l%   = 99
  104.          
  105.             n$ = n$ + 
  106.          
  107.       
  108.  Teste Header
  109.  err% = 0 
  110.       
  111.  n$ <> "ALRM" 
  112.          err% = 2
  113. j/         err$ = "Alarmfileformat falsch !!"
  114.       
  115. n$   
  116.  Schleife durch alle Rekords
  117.    rec% = -1: flag% = 
  118.  err% = 0 
  119.       
  120.          rec% += 1
  121.          
  122.  Lese Task-Flag
  123. t8         err% = 
  124. ptr(hdl%, &0E + &94 + (&97 * rec%))
  125.          
  126.  err% <> 0 
  127. v5            
  128.  Fileende erreicht, normales Ende !!
  129.             err% = -1
  130. x0            err$ = "Rekord-Ende erreicht !!"
  131.             flag% = 
  132.          
  133. {             n% = 
  134. bget(hdl%)
  135.             
  136.  n% < 0 
  137.                err% = -n%
  138. ~3               err$ = "Lesefehler im Rekord !!"
  139.             
  140. )               
  141.  Teste auf Task-Alarm
  142. +               
  143.  (n% 
  144.  4) = 4 
  145.  flag%=
  146.             
  147.          
  148.       
  149.  flag%
  150.  Wenn ein Taskalarm gefunden wurde koennen wir weitermachen.
  151.  Wir holen dann die "lokale" Zeit aus dem Rekord.
  152.  err% = 0 
  153. +      
  154. #hdl% = &0E + &0F + (&97 * rec%)
  155. !      ord%!24  = 256 * 
  156. #hdl%
  157.       ord%!24 += 
  158. #hdl%
  159.       ord%!20  = 
  160. #hdl%
  161.       ord%!16  = 
  162. #hdl%
  163.       ord%!12  = 
  164. #hdl%
  165.       ord%!8   = 
  166. #hdl%
  167.       ord%!4   = 
  168. #hdl%
  169.       ord%!0   = 0
  170. *      
  171.  Nach Territory modifizieren...
  172. =      
  173. "Territory_ConvertOrdinalsToTime", -1, buf%, ord%
  174. 1      
  175.  buf% enthaelt nun die 5Byte UTC-Zeit.
  176. =      
  177. "Territory_ConvertTimeToUTCOrdinals", ,buf%, ord%
  178. 3      
  179.  ord% enthaelt nun die UTC in Ordinalen.
  180. 0      
  181.  debug% 
  182.  "     Set to taskalarm ";
  183.  Wenn kein Taskalarm gefunden wurde, setzen wir die aktuelle Zeit !!
  184.  err% = -1 
  185. 6      
  186.  Hole UTC-Zeit als 5 Byte Block, PRM3 1-421
  187.       ?buf% = 3
  188.       
  189. "OS_Word", 14, buf%
  190. 1      
  191.  buf% enthaelt nun die 5Byte UTC-Zeit.
  192. =      
  193. "Territory_ConvertTimeToUTCOrdinals", ,buf%, ord%
  194. 3      
  195.  ord% enthaelt nun die UTC in Ordinalen.
  196. ,      ord%!0 = 0: ord%!4 = 0: ord%!8 = 0
  197. 0      
  198.  debug% 
  199.  "       Set to current ";
  200.       err% = 0
  201.  Jetzt wird die Zeit eingesetzt in die Uhrenregister.
  202.  err% = 0 
  203.       
  204.  debug% 
  205. @         
  206.  5Byte UTC-Zeit in buf% in Zeitstring konvertieren
  207. Z         
  208. "OS_ConvertDateAndTime", buf%, str%, 40, "%DY %MN %CE%YR.%24:%MI:%SE" 
  209.          ?l% = 13
  210. !         
  211.  "time : ";$str%"."
  212.       
  213. '      
  214.  Alarmbuffer zusammenstellen
  215. +      
  216.  Zieladresse im Buffer eintragen
  217.       buf%?0 = 9
  218. *      
  219.  Hundertstel Sekunden eintragen
  220. 8      buf%?1 = (ord%!0  
  221.  10) + ((ord%!0  
  222.  10)<< 4)
  223. !      
  224.  Sekunden (bei +17/18)
  225. 8      buf%?2 = (ord%!4  
  226.  10) + ((ord%!4  
  227.  10)<< 4)
  228.        
  229.  Minuten (bei +14/15)
  230. 8      buf%?3 = (ord%!8  
  231.  10) + ((ord%!8  
  232.  10)<< 4)
  233.        
  234.  Stunden (bei +11/12)
  235. 8      buf%?4 = (ord%!12 
  236.  10) + ((ord%!12 
  237.  10)<< 4)
  238.       
  239.  Tag (bei +0/1)
  240. 8      buf%?5 = (ord%!16 
  241.  10) + ((ord%!16 
  242.  10)<< 4)
  243.       
  244.  Monat (bei +3/4)
  245. 8      buf%?6 = (ord%!20 
  246.  10) + ((ord%!20 
  247.  10)<< 4)
  248.       
  249.  Alarm Timer
  250.       buf%?7 = 0
  251. 8      
  252.  Zeit in Alarm-Register der IIC-Uhr schreiben
  253.       
  254. putAlarm(buf%)
  255.       
  256. SwitchToAlarm
  257.       
  258. AlarmActivate
  259.  Jetzt behandeln wir aufgetretene Fehler und zeigen sie an.
  260.  err%<>0 
  261.  debug% 
  262. ;      
  263.  "Error in FNsetzeTaskalarmzeit: Zeile ";
  264. -      
  265.  "erkannte Ursache: ";err%;":"err$
  266. #hdl%
  267. = err%
  268. N;-------------------------------------------------------------------------
  269. $; Filehandling mit Errorabfragen
  270. E; wir koenen nur durch lokale Error-Handler erreichen, den Status
  271. '; einer IO-Operation festzustellen.
  272. H; Dies ist insofern doesig, da wir alle IO-Operationen neu schreiben
  273. ; muessen.
  274. 9; Die Funktionen geben den Errorcode zurueck. 0 = ok.
  275. N;-------------------------------------------------------------------------
  276. openin(file$)
  277. #h%: =0:
  278. "FNopen: File nicht da !": =0
  279.    h% = 
  280. (file$)
  281. #h% = 0
  282. ptr(hdl%, off%)
  283. "FNptr: Fileende erreicht !!": = 
  284. #hdl% = off%
  285. bget(hdl%)
  286. "FNbget: Fileende erreicht !": = -
  287.    d% = 
  288. #hdl%
  289. N;-------------------------------------------------------------------------
  290. B;          IIC-Routinen   -  abgestimmt auf den Uhrenbaustein.
  291. N;-------------------------------------------------------------------------
  292. 8; Speichern eines Bytes an einer beliebigen Adresse.
  293. N;-------------------------------------------------------------------------
  294. poke(address%, value%)
  295.  blk%
  296.  blk% 2
  297.  clkadr% = 0 
  298.  clkadr% = %10100000 :
  299.  Default is normal clock.
  300. ?blk% = address%
  301. ?(blk%+1) = value%
  302.  "IIC_Control", clkadr%, blk%, 2
  303. N;-------------------------------------------------------------------------
  304. G; Lesen eines Bytes von einer beliebigen Adresse. Kann auch benutzt
  305. '; werden, um die Adresse zu setzen.
  306. N;-------------------------------------------------------------------------
  307. peek(address%)
  308.  blk%
  309.  blk% 2
  310.  clkadr% = 0 
  311.  clkadr% = %10100000 :
  312.  Default is normal clock.
  313. ?blk% = address%
  314.  "IIC_Control", clkadr%  , blk%, 1  :
  315.  write address
  316.  "IIC_Control", clkadr%+1, blk%, 1  :
  317.  read value
  318. = ?blk%
  319. N;-------------------------------------------------------------------------
  320. ?; Schreiben der aktuellen Alarmzeit aus einem 8-Byte-Buffer
  321. N; ACHTUNG: Das 1. Byte ist das Statusbyte und wird nicht mitgeschrieben !!
  322. ; pointer_char[8] buffer%
  323. N;-------------------------------------------------------------------------
  324. putAlarm(buffer%)
  325.  old%
  326.  buffer% <> 0 
  327.  clkadr% = 0 
  328.  clkadr% = %10100000 :
  329.  Default is normal clock.
  330. D   old%     = ?buffer%                     :
  331.    store old status
  332. D   ?buffer% = 9                            :
  333.  set   startaddress
  334.  "IIC_Control", clkadr%, buffer%, 8  :
  335.  write address and data
  336. D   ?buffer% = old%                         :
  337.  restore old status
  338. !N;-------------------------------------------------------------------------
  339. "<; (1) Wir schalten die Uhr auf Alarm-Modus und damit den
  340. #G;     default- (reset-) maessigen Sekundentakt am Alarmausgang aus.
  341. $N;-------------------------------------------------------------------------
  342. SwitchToAlarm
  343. ' a%  = 
  344. peek(0) 
  345.  (255-1-2-4)
  346. a% += 4
  347. poke(8,0)     :
  348.  Alarm-Register : alles "aus"
  349. poke(0,a%)    :
  350.  Status-Register: Alarm-System "an"
  351.  Alarm nun aktiv, Bit 0 = 0 --> Alarm = 0
  352. .N;-------------------------------------------------------------------------
  353. /"; Aktivieren des Alarm-Systems
  354. 03; Vorher muss 
  355. SwitchToAlarm aufgerufen werden.
  356. ; Entry  -
  357. ; Exit   -
  358. 3N;-------------------------------------------------------------------------
  359. AlarmActivate
  360. 5Z   
  361. poke(8,48+128)    :
  362.  Alarm-Register: NO timer, dated alarm, alarm flag & interrupt
  363. 8N;-------------------------------------------------------------------------
  364. 9$; Deaktivieren des Alarm-Systems
  365. :0; dies ist also nicht dasselbe wie ...init !
  366. ; Entry  -
  367. ; Exit   -
  368. =N;-------------------------------------------------------------------------
  369. AlarmDeactivate
  370. ?6   
  371. poke(8,0)         :
  372.  Alarm-Register: alles aus
  373.